package com.example.eeuse.controller;


import com.example.eeuse.mapper.DocumentMapper;
import com.example.eeuse.model.Document;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
import org.dromara.easyes.core.kernel.EsWrappers;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StopWatch;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 测试使用Easy-ES
 * <p>
 * Copyright © 2021 xpc1024 All Rights Reserved
 *
 * @author Jungle
 */
@Slf4j
@RestController
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class TestUseEeController {
    private final DocumentMapper documentMapper;

    @GetMapping("/createIndex")
    public Boolean createIndex() {
        // 初始化-> 创建索引
        return documentMapper.createIndex();
    }

    @GetMapping("/insert")
    public Integer insert() {
        // 初始化-> 新增数据
        int sum = 0;
        for (int i = 10000; i <= 100000; i++) {
            Document document = new Document();
            document.setId(String.valueOf(i));
            document.setTitle("五星红旗");
            document.setContent("我是中国人我爱我的祖国我是中国人我爱我的祖国我是中国人我爱我的祖国我是中国人我爱我的祖国我是中国人我爱我的祖国我是中国人我爱我的祖国==>" + i);
            documentMapper.insert(document);
            sum++;

        }
        return sum;

    }

    @GetMapping("/search")
    public List<Document> search() {
        // 查询出所有标题为老汉的文档列表
        LambdaEsQueryWrapper<Document> wrapper = new LambdaEsQueryWrapper<>();
        wrapper.eq(Document::getTitle, "老汉")
                .and(i -> i.eq(Document::getId, 1).eq(Document::getContent, "推车"))
                .or()
                .and(i -> i.eq(Document::getId, 2).eq(Document::getContent, "推土"));
        String source = documentMapper.getSource(wrapper);
        System.out.println(source);
        return documentMapper.selectList(wrapper);
    }


    @GetMapping("/select")
    public Document testSelect() {
        // 测试查询 写法和MP一样 可以用链式,也可以非链式 根据使用习惯灵活选择即可
        String content = "中国人";
        return EsWrappers.lambdaChainQuery(documentMapper)
                .like(Document::getContent, content)
                .orderByDesc(Document::getId)
                .limit(1)
                .one();
    }


    @GetMapping("/my-search")
    public String mySearch() {
        // 测试查询 写法和MP一样 可以用链式,也可以非链式 根据使用习惯灵活选择即可
        String content = "中国人";
        Long count = EsWrappers.lambdaChainQuery(documentMapper)
                .like(Document::getContent, content)
                .count();
        // .orderByDesc(Document::getId)
        // .limit(1)
        // .one();
        log.info("==>{}", count);
        return null;
    }


    @GetMapping("/list")
    public List<Document> list() {
        // 测试查询 写法和MP一样 可以用链式,也可以非链式 根据使用习惯灵活选择即可
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        String content = "中国人";
        List<Document> list = EsWrappers.lambdaChainQuery(documentMapper)
                .like(Document::getContent, content)
                .list();
        stopWatch.stop();
        long totalTimeMillis = stopWatch.getTotalTimeMillis();
        log.info("耗时==>{}毫秒 数据总数==>{}条", totalTimeMillis, list.size());
        return list;
    }


    @GetMapping("/update")
    public Document testUpdate() {
        Document document = EsWrappers.lambdaChainQuery(documentMapper).like(Document::getTitle, "老汉").one();

        log.info("查询到的对象==>{}", document);
        // 测试更新 更新有两种情况 分别演示如下:
        // case1: 已知id, 根据id更新 (为了演示方便,此id是从上一步查询中复制过来的,实际业务可以自行查询)
        String id = document.getId();
        String title1 = "隔壁老王";
        Document document1 = new Document();
        document1.setId(id);
        document1.setTitle(title1);
        Integer i = documentMapper.updateById(document1);
        log.info("==>{}", i);


        // case2: id未知, 根据条件更新
        // LambdaEsUpdateWrapper<Document> wrapper = new LambdaEsUpdateWrapper<>();
        // wrapper.eq(Document::getTitle, title1);
        // Document document2 = new Document();
        // document2.setTitle("隔壁老李");
        // document2.setContent("推*技术过软");
        // Integer update = documentMapper.update(document2, wrapper);
        // log.info("==>{}", update);
        return documentMapper.selectById(id);
    }
}
